/**
 * @file storeUtils.js
 * @description store工具类,对接main进程的storeUtils.ts
 * @module utils/storeUtils
 * @author kikolove
 */
const storeDefaultOptions = {
    name: 'config',//file name
    // encryptionKey: '6b2fa44c518566e81dcd395485a8264d94722d7202ee8a93224cffef8947f5c5', //kikolove
    fileExtension: 'json',
    clearInvalidConfig: true,
};

const stringifyWithCache = (json_data) => {
    const cache = new Set();
    const json_str = JSON.stringify(json_data, (key, value) => {
        if (typeof value === 'object' && value !== null) {
            if (cache.has(value)) {
                return;
            }
            cache.add(value);
        }
        return value;
    });
    cache.clear(); // 释放 cache
    return json_str;
}

const initData = async (configStore) => {
    const hasConfig = await hasStore(`baseConfig`);
    if (!hasConfig) {
        setStore('baseConfig', configStore.getConfig, storeDefaultOptions);
    } else {
        const localConfig = await getStore(`baseConfig`, storeDefaultOptions);
        const res = Object.assign({}, configStore, localConfig);
        configStore.setConfig(res);
    }
    return configStore;
}

const getStore = (name, option) => {
    return window.electron.ipcRenderer.invoke('getStore', { name, option });
}

const getBaseConfig = () => {
    return getStore('baseConfig', storeDefaultOptions);
}

const setStore = (name, value, option) => {
    return window.electron.ipcRenderer.invoke('setStore', { name, value, option });
}

const setBaseConfig = (key, value) => {
    return setStore(`baseConfig.${key}`, value, storeDefaultOptions);
}

const removeStore = (name, option) => {
    return window.electron.ipcRenderer.invoke('removeStore', { name, option });
}

const clearStore = () => {
    return window.electron.ipcRenderer.invoke('clearStore');
}

const hasStore = (name) => {
    return window.electron.ipcRenderer.invoke('hasStore', { name });
}

const getAppPath = () => {
    return window.electron.ipcRenderer.invoke('getAppPath');
}

export { initData, getStore, getBaseConfig, setStore, setBaseConfig, removeStore, clearStore, hasStore, getAppPath, stringifyWithCache }